Python 连接 MySQL 数据库

让程序"开口跟数据库说话" —— 学完这一章,你就能写出真正的应用

🎯 本章你需要掌握的(按重要程度排序)
  • Python 连接 MySQL 的 5 步流程 必考核心
  • mysql.connector.connect() 怎么用 必考
  • Cursor 的常用方法:execute / fetchone / fetchall 必考
  • commit 和 rollback 的作用 必考
  • 用 try-except 处理事务的标准写法 必考
  • 能写 CRUD 完整代码(插入/删除/修改/查询)必考

💡 先想象一个场景:

你做了一个图书管理系统的网站。用户在浏览器输入 ISBN,网页要去数据库查这本书的信息,然后显示出来。

这中间有个问题:浏览器不会自己去查数据库 —— 必须有"中间人"

这个中间人就是 Python 程序(或 Java、PHP 等)。它一边接收浏览器的请求,一边操作 MySQL,最后把结果返回给浏览器。

👉 本章就讲:怎么用 Python 跟 MySQL "对话"。这是 Web 开发、数据分析、爬虫等等所有数据库应用的第一步

一、Python DB API 是什么?了解

1.1 一句话定义

📖 定义

Python DB API = Python 访问数据库的统一标准。所有支持它的库(连 MySQL 的、连 Oracle 的、连 SQLite 的)都按这个标准来。

结果:学会一种,其他都会

🌰 通俗类比

就像 USB 接口标准:插鼠标、插键盘、插U盘,外观和用法一样,但里面是不同设备。

Python DB API 也一样 —— 用 Python 连 MySQL、Oracle、SQLite,代码套路几乎一样

1.2 三大核心对象了解

Python DB API 提供 3 个核心对象:

1️⃣ 网络连接

Connection

跟数据库的"网络连接"

主要方法:cursor() / commit() / rollback() / close()

2️⃣ 执行命令

Cursor(游标)

执行 SQL、获取结果的工具。

主要方法:execute() / fetchone() / fetchall() / close()

3️⃣ 异常处理

Exceptions

各种错误异常

如 DatabaseError、OperationalError、ProgrammingError

💡 用法分工

Connection:管"连进来 + 提交事务"

Cursor:管"执行 SQL + 拿结果"

Exceptions:捕获异常时用

1.3 第三方包:mysql-connector-python必考

Python 自带的标准库不能直接连 MySQL,需要装第三方包。最官方的是 mysql-connector-python(MySQL 官方维护)。

命令行 · 安装
# 用 pip 安装
pip install mysql-connector-python

装完后,在 Python 里用 import mysql.connector 就能用了。

💬 其他常用包

除了 mysql-connector,还有 PyMySQLmysqlclient 等。用法都差不多,本章用官方的 mysql-connector。

二、5 步流程:核心套路必考核心

2.1 牢记这 5 步必考

不管做什么操作(CRUD),都是这 5 步。记住这个套路,期末考试的代码题就完成一大半了。

1
导入接口
import mysql.connector
2
建立连接
connect(...)
3
创建游标
db.cursor()
4
执行 SQL
cursor.execute(...)
5
关闭
close()
⭐ 5 步速记口诀

"导 → 连 → 游 → 执 → 关"

导入接口 → 建立连接 → 创建游标 → 执行 SQL → 关闭

2.2 connect() 函数:连接参数必考

📋 connect() 模板
db = mysql.connector.connect(
    host='主机地址',           # 数据库服务器在哪
    user='用户名',             # 登录账号
    passwd='密码',             # 登录密码
    database='数据库名',       # 要操作哪个数据库
    port=3306                 # 端口号,可省略
)

5 个参数详解

参数含义常见值
host 数据库服务器地址 'localhost' 或 IP
user 登录用户名 'root'
passwd 登录密码 '123456'
database 要使用的数据库名 'teaching'
port 端口号,可省略(默认 3306) 3306
⚠️ 注意

① 数据库 必须先存在,连接才能成功。如果是新数据库,要先在 MySQL 里 CREATE DATABASE teaching

② 密码错了、host 错了,会抛 OperationalError 异常

三、第一个完整例子:查询版本实操

3.1 完整代码 + 逐行解读

需求:连上 teaching 数据库,查询并打印 MySQL 的版本号。

🐍 Python · 完整例子
# 第 1 步:导入接口
import mysql.connector

# 第 2 步:建立连接
db = mysql.connector.connect(
    host='localhost',
    user='root',
    passwd='123456',
    database='teaching'
)

# 第 3 步:创建游标
cursor = db.cursor()

# 第 4 步:执行 SQL(这里查询 MySQL 版本)
cursor.execute("SELECT VERSION()")
data = cursor.fetchone()    # 取一行结果
print("Database version :", data)

# 第 5 步:关闭游标和连接
cursor.close()
db.close()
▶ 运行结果 Database version : ('8.0.23',)
💬 关键点

fetchone() 返回的是元组(用括号包起来的):('8.0.23',)

② 后面的逗号 , 表明这是一个 单元素元组

③ 想拿到字符串本身,用 data[0] 取第一个元素

💡 这就是 5 步的"骨架"

后面所有的 CRUD 例子,都按这 5 步写,只是第 4 步的 SQL 不一样。

四、CRUD 实战实操必考

4.1 插入数据:INSERT必考

需求:在 s 表中插入一名新学生(s9, 王天一, 女, 18, 计算机, 信息学院)。

🐍 Python · 插入数据
import mysql.connector

db = mysql.connector.connect(
    host='localhost', user='root',
    passwd='123456', database='teaching'
)
cursor = db.cursor()

try:
    cursor.execute("INSERT INTO s VALUES('s9','王天一','女',18,'计算机','信息学院')")
    db.commit()        # ⭐ 重要:必须提交事务!
    print("插入成功")
except:
    db.rollback()      # 出错就回滚
    print("插入失败")

cursor.close()
db.close()
⚠️ 必须 commit!

修改类操作(INSERT/UPDATE/DELETE)必须调用 db.commit(),否则数据只在缓冲区,不会真的写入数据库

这是初学者最容易忘的,也是必考点。

💡 try-except 是标准模板

修改类操作 都要用 try-except 包起来

try:执行 SQL + commit 提交

except:rollback 回滚

这样保证数据一致性 —— 要么全成功,要么全失败。

4.2 修改数据:UPDATE必考

需求:把"林毅"的专业改成"计算机"。

🐍 Python · 修改数据
import mysql.connector

db = mysql.connector.connect(
    host='localhost', user='root',
    passwd='123456', database='teaching'
)
cursor = db.cursor()

# 把 SQL 提取出来,更清晰
sql = "UPDATE s SET maj='计算机' WHERE sn='林毅'"

try:
    cursor.execute(sql)
    db.commit()
    print("修改了", cursor.rowcount, "行")  # rowcount 看影响了多少行
except:
    db.rollback()

cursor.close()
db.close()
💡 cursor.rowcount

cursor.rowcount 返回 受影响的行数。可以用它判断操作是否真的改了数据。

4.3 删除数据:DELETE必考

需求:删除学号为 s12 的学生。

🐍 Python · 删除数据
import mysql.connector

db = mysql.connector.connect(
    host='localhost', user='root',
    passwd='123456', database='teaching'
)
cursor = db.cursor()

try:
    cursor.execute("DELETE FROM s WHERE sno='s12'")
    db.commit()
    print("删除成功")
except:
    db.rollback()

cursor.close()
db.close()
💬 INSERT / UPDATE / DELETE 的共性

三种修改操作的代码 结构完全一样,只是 SQL 不同。都要 commit都要 try-except

4.4 查询数据:SELECT必考

fetch 三件套

方法作用返回值
fetchone() 一行 元组 ('s1', '王彤', ...)
fetchall() 全部行 元组列表 [('s1', ...), ('s2', ...)]
fetchmany(n) n 行 元组列表(最多 n 个)

例:查询所有 age >= 20 的学生

🐍 Python · 查询多行
import mysql.connector

db = mysql.connector.connect(
    host='localhost', user='root',
    passwd='123456', database='teaching'
)
cursor = db.cursor()

cursor.execute("SELECT * FROM s WHERE age >= 20")
results = cursor.fetchall()        # 取全部

# 遍历打印
for row in results:
    print(row)

cursor.close()
db.close()
▶ 运行结果 ('s10', '苏红霞', '女', 20, '信息', '信息学院') ('s2', '苏乐', '女', 20, '信息', '信息学院') ('s6', '何欣荣', '女', 21, '计算机', '信息学院')
⚠️ 查询不需要 commit

SELECT 只是读取数据,不改数据,不需要调用 commit

记住:"读不 commit,写必 commit"

💡 fetchone vs fetchall 怎么选?

① 只想要一条结果 → 用 fetchone()(高效,不浪费内存)

② 想要全部结果 → 用 fetchall()

③ 数据量很大但只要前 N 条 → 用 fetchmany(N)

五、事务:commit 和 rollback必考

5.1 为什么要 commit?必考

这是本章最容易踩的坑,也是必考点

📖 关键概念

Python 调用 execute() 修改数据时,修改先在缓冲区,并没有真的写入 MySQL

必须调用 db.commit()修改才会真的"落盘"

🌰 类比"在线编辑文档"

execute() = 在编辑器里打字(屏幕上看得到)

commit() = 点"保存"按钮(真的存到硬盘)

不点保存就关掉,前面打的字全没了 —— 不 commit 也是一样。

5.2 rollback 的作用

📖 定义

db.rollback() = 撤销所有还没 commit 的修改,回到上一次 commit 的状态。

典型场景:批量插入时其中一条出错

不用 rollback 的话,前面已经成功的几条会留下,数据不一致。用了 rollback 全部撤销,要么全成功要么全失败

5.3 标准模板:try-except 处理事务必考

📋 标准模板
try:
    cursor.execute(sql1)     # 执行 SQL
    cursor.execute(sql2)
    db.commit()              # 全部成功 → 提交
except:
    db.rollback()            # 任何一个失败 → 全部回滚

例:批量插入,保证原子性

🐍 Python · 批量插入
import mysql.connector

db = mysql.connector.connect(
    host='localhost', user='root',
    passwd='123456', database='teaching'
)
cursor = db.cursor()

sql1 = "INSERT INTO s VALUES('s9','王天一','女',18,'计算机','信息学院')"
sql2 = "INSERT INTO s VALUES('s10','苏红霞','女',20,'信息','信息学院')"
sql3 = "INSERT INTO s VALUES('s11','林勇','男',19,'信息','信息学院')"

try:
    cursor.execute(sql1)
    cursor.execute(sql2)
    cursor.execute(sql3)
    db.commit()        # 三条全部成功才 commit
    print("全部插入成功")
except Exception as e:
    db.rollback()      # 任何一条失败,全部回滚
    print("出错回滚:", e)

cursor.close()
db.close()
⭐ 必背模板

修改操作的"黄金套路"

① 用 try 包住 execute 和 commit

② 用 except 调用 rollback

这样能保证 原子性(要么全成,要么全败)。

💡 跟第 9 章联动

这就是第 9 章学的"事务的原子性(Atomicity)"在 Python 里的实现。commit + rollback 共同保证原子性

六、本章小结

📋 三句话总结

🎯 核心内容
  • Python 通过 mysql.connector 连接 MySQL,5 步流程:导 → 连 → 游 → 执 → 关
  • 修改数据(INSERT/UPDATE/DELETE)必须 commit,出错要 rollback,标配 try-except 模板。
  • 查询用 fetchone(一行)/ fetchall(全部)/ fetchmany(n)(n 行),不需要 commit。

本章必考点回顾

⭐ 期末考点

  1. 写一段完整的 Python 连 MySQL 代码(综合大题,分值最高)
  2. connect() 函数的 5 个参数(填空)
  3. commit 和 rollback 的作用(简答)
  4. fetchone vs fetchall 的区别
  5. 5 步流程(顺序题)
  6. 什么时候要 commit(修改要、查询不要)

关键速记

💡 5 条核心口诀

"导 → 连 → 游 → 执 → 关" —— 5 步流程

"读不 commit,写必 commit" —— 何时提交

"try 执行 commit,except 写 rollback" —— 标准模板

"fetchone 一行,fetchall 全部" —— 查询方法

"提交才落盘,不提白干" —— commit 的意义

课堂综合测验

第 1 题

下列代码 缺少哪个关键步骤,会导致数据没有真正写入数据库?

🐍 Python
cursor.execute("INSERT INTO s VALUES('s9','王天一','女',18,'计算机','信息学院')")
cursor.close()
db.close()
A. 缺少 cursor.fetchall()
B. 缺少 db.commit()
C. 缺少 cursor.execute()
D. 缺少 import mysql.connector

✅ 答案:B

INSERT 修改了数据,但 没有 commit 就关闭连接 —— 修改只在缓冲区,不会真的存到数据库

记住:"读不 commit,写必 commit"。INSERT/UPDATE/DELETE 都要 commit。

第 2 题

下列关于 fetchone()fetchall() 的说法,错误 的是?

A. fetchone() 返回元组,fetchall() 返回元组列表
B. fetchall() 把所有结果一次性加载到内存
C. SELECT 操作必须在 fetchall() 后调用 commit()
D. 大数据量时建议用 fetchmany() 分批取

✅ 错的是:C

SELECT 是查询操作,没有修改数据,不需要 commit

口诀:"读不 commit,写必 commit"

第 3 题

Python 连接 MySQL 数据库的 5 步流程,正确顺序 是?

A. 创建游标 → 建立连接 → 导入接口 → 执行 SQL → 关闭
B. 导入接口 → 建立连接 → 创建游标 → 执行 SQL → 关闭
C. 导入接口 → 创建游标 → 建立连接 → 执行 SQL → 关闭
D. 建立连接 → 导入接口 → 执行 SQL → 创建游标 → 关闭

✅ 正确:B

速记:"导 → 连 → 游 → 执 → 关"

逻辑:先导入包(才能用),然后建立连接(先连上数据库),通过连接创建游标(游标是连接的"工具"),用游标执行 SQL,最后关闭。

第 4 题

下列关于 commit()rollback() 的说法,正确 的是?

A. commit() 用于关闭数据库连接
B. rollback() 必须在 commit() 之后调用
C. rollback() 可以撤销还没 commit 的修改,回到上一次 commit 的状态
D. SELECT 查询失败时也要调用 rollback()

✅ 答案:C

分析:

A 错:commit 是 提交事务,关闭连接是 close()

B 错:rollback 通常是在 try-except 的 except 块里调用,撤销没 commit 成功的修改

C 对:rollback 让数据库回到 上一次 commit 后的状态

D 错:SELECT 是查询,没修改数据,不需要 rollback

🎓 整门课程结束!

到这一章,《数据库原理及应用教程(MySQL)》就讲完了。回顾你这一学期学到的:

  • 数据库基础理论(关系模型、SQL 语言、视图)
  • 数据库管理(安全管理、并发控制、备份还原)
  • 数据库设计(需求分析、E-R 图、规范化、物理设计)
  • 高级编程(存储过程、函数、触发器、事件)
  • 实际应用(用 Python 连接 MySQL 开发)

这些知识 构成了一个完整的"造数据库 + 用数据库" 体系。无论你之后做 Web 开发、数据分析、还是后端工程,这些都是吃饭的本事。

💡 学习建议

① 期末复习:重点看必考点(每章都标了 ⭐),把口诀背熟

② 课后实战:找个真实项目(比如做个图书管理系统)从头到尾写一遍,把这本书每章都用上一次

③ 拓展学习:学完这本书,建议继续学 Redis、MongoDB(NoSQL)、Web 框架(Flask/Django)

🎉 恭喜你走到这里!期末考个好成绩 💪